/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.raitcon.hibernate.backbean;

import com.raitcon.hibernate.bean.Anio;
import com.raitcon.hibernate.bean.Asignatura;
import com.raitcon.hibernate.bean.DetalleLibreta;
import com.raitcon.hibernate.bean.Grado;
import com.raitcon.hibernate.bean.Libreta;
import com.raitcon.hibernate.db.AsignaturaDB;
import com.raitcon.hibernate.db.DetalleLibretaDB;
import com.raitcon.hibernate.db.LibretaDB;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.apache.log4j.Logger;

/**
 *
 * @author Mike
 */
@ManagedBean(name ="libretaBean")
@ViewScoped
public class LibretaBean implements Serializable {
    
    protected static Logger log = Logger.getLogger(LibretaBean.class); 
    private static  final  long serialVersionUID=-2377612760546575078L; 
    
    private static final int DECIMALS = 1;
  private static final int CLIENT_ROWS_IN_AJAX_MODE = 15;
  private static final int ROUNDING_MODE = BigDecimal.ROUND_HALF_UP;
    private int idLibreta;
    private int idGrado;
    private int idAnio;
    private Grado grado;
    private Anio anio;
    private int clientRows;
    private int optNewOrUpdate=0;
    //variables para recuperar valores de popup
    private int idAsignatura;
    private Asignatura asignatura;
    private int currentLibIndex;
    private DetalleLibreta editDetalleLibreta=new DetalleLibreta() ;
    private List<DetalleLibreta> listDetalleLibretas=new ArrayList<DetalleLibreta>();
    private String  msg;
    private int page = 1;
    private Integer option;
    private String comentarios;
    
    @PostConstruct
  public void init(){
       log.info("Running init registro notas");
       this.setOption(0);
  }
  
  
  public void switchAjaxLoading(ValueChangeEvent event) {
        this.clientRows = (Boolean) event.getNewValue() ? CLIENT_ROWS_IN_AJAX_MODE : 0;
  
  }
  
  public void actualizar() {
      
         if(findAsignatura(this.asignatura.getIdAsignatura())){
             setMsg("La asignatura ya existe, favor de seleccionar una válida");
             return;
         }
         editDetalleLibreta.setAsignatura(asignatura);
        log.info("Iniciamos la actualización de detalle:"+currentLibIndex);
        log.info("Iniciamos la actualización de detalle getIdDetalleLibreta:"+editDetalleLibreta.getAsignatura().getDescripcion());
        
        listDetalleLibretas.set(currentLibIndex, editDetalleLibreta);
        
        setMsg("");
       
           
        //return listDetalleLibretas;
  }
   
  
   public void newOrSaveNota() {
       if((this.listDetalleLibretas).isEmpty()){
           this.setMsg("Debe tener como mínimo un asignatura ingresado!!!");
           log.info("Ingresar como mínimo una asignatura..!!!");
           return;
       }
       Libreta libetaFind=this.findLibretaId();
       if(!(libetaFind!=null  && getOption()==0)){
            
        String result = "";
        Libreta libreta = new Libreta();
        
        libreta.setAnio(new Anio(idAnio,1));
        libreta.setGrado(new Grado(idGrado));
        libreta.setComentarios(comentarios);
        log.info("idAsignatura::"+getIdAsignatura());
        LibretaDB libretaDB=new LibretaDB();
        String msg="";
        msg=libretaDB.insertOrUpdateNota(libreta, listDetalleLibretas, getOption(), libetaFind);
         if (!msg.equals("")) {
            this.msg = msg;
            this.listDetalleLibretas.clear();
        } else {
           this.msg = "Se Generó errores al intentar guardar nota";
        }   
        }else{
            setMsg("ID ya se encuentra registrado con parámetros ingresados");
       }
       
   }
    /**
     * @return the idLibreta
     */
    public int getIdLibreta() {
        return idLibreta;
    }

    /**
     * @param idLibreta the idLibreta to set
     */
    public void setIdLibreta(int idLibreta) {
        this.idLibreta = idLibreta;
    }

    /**
     * @return the grado
     */
    public Grado getGrado() {
        return grado;
    }

    /**
     * @param grado the grado to set
     */
    public void setGrado(Grado grado) {
        this.grado = grado;
    }

    /**
     * @return the anio
     */
    public Anio getAnio() {
        return anio;
    }

    /**
     * @param anio the anio to set
     */
    public void setAnio(Anio anio) {
        this.anio = anio;
    }

    /**
     * @return the listDetalleLibretas
     */
    public List<DetalleLibreta> getListDetalleLibretas() {
        return listDetalleLibretas;
    }

    /**
     * @param listDetalleLibretas the listDetalleLibretas to set
     */
    public void setListDetalleLibretas(List<DetalleLibreta> listDetalleLibretas) {
        this.listDetalleLibretas = listDetalleLibretas;
    }

    /**
     * @return the idGrado
     */
    public int getIdGrado() {
        return idGrado;
    }

    /**
     * @param idGrado the idGrado to set
     */
    public void setIdGrado(int idGrado) {
        this.idGrado = idGrado;
    }

    /**
     * @return the idAnio
     */
    public int getIdAnio() {
        return idAnio;
    }

    /**
     * @param idAnio the idAnio to set
     */
    public void setIdAnio(int idAnio) {
        this.idAnio = idAnio;
    }
    
    
    public List<DetalleLibreta> addAsignatura(){
        
         if(findAsignatura(this.asignatura.getIdAsignatura())){
             setMsg("La asignatura ya existe, favor de seleccionar una válida");
             return listDetalleLibretas;
         }
         listDetalleLibretas.add(new DetalleLibreta(-1,new Libreta(),this.asignatura));
         setMsg("");
         return listDetalleLibretas;
    }
    
    public List<DetalleLibreta> delAsignatura(){
        DetalleLibreta dtLibreta=listDetalleLibretas.get(currentLibIndex);
       listDetalleLibretas.remove(dtLibreta);
       if(dtLibreta.getIdDetalleLibreta()!=-1){
       DetalleLibretaDB  dtLibDB= new DetalleLibretaDB();
       setMsg(dtLibDB.delete(dtLibreta));
       
       }
       return listDetalleLibretas;
    }
    
    

    /**
     * @return the idAsignatura
     */
    public int getIdAsignatura() {
        return idAsignatura;
    }

    /**
     * @param idAsignatura the idAsignatura to set
     */
    public void setIdAsignatura(int idAsignatura) {
        this.idAsignatura = idAsignatura;
    }

    /**
     * @return the asignatura
     */
    public Asignatura getAsignatura() {
        return asignatura;
    }

    /**
     * @param asignatura the asignatura to set
     */
    public void setAsignatura(Asignatura asignatura) {
        this.asignatura = asignatura;
    }

    /**
     * @return the editDetalleLibreta
     */
    public DetalleLibreta getEditDetalleLibreta() {
        return editDetalleLibreta;
    }

    /**
     * @param editDetalleLibreta the editDetalleLibreta to set
     */
    public void setEditDetalleLibreta(DetalleLibreta editDetalleLibreta) {
        this.editDetalleLibreta = editDetalleLibreta;
    }

    /**
     * @return the clientRows
     */
    public int getClientRows() {
        return clientRows;
    }

    /**
     * @param clientRows the clientRows to set
     */
    public void setClientRows(int clientRows) {
        this.clientRows = clientRows;
    }

    /**
     * @return the currentLibIndex
     */
    public int getCurrentLibIndex() {
        return currentLibIndex;
    }

    /**
     * @param currentLibIndex the currentLibIndex to set
     */
    public void setCurrentLibIndex(int currentLibIndex) {
        this.currentLibIndex = currentLibIndex;
    }

    /**
     * @return the optNewOrUpdate
     */
    public int getOptNewOrUpdate() {
        return optNewOrUpdate;
    }

    /**
     * @param optNewOrUpdate the optNewOrUpdate to set
     */
    public void setOptNewOrUpdate(int optNewOrUpdate) {
        this.optNewOrUpdate = optNewOrUpdate;
    }
    
    public void optionActualizar(){
        log.info("ejecuto optionActualizar");
        optNewOrUpdate=1;
    }
    
    /*funcion para  buscar  asignatura*/
    
    public boolean findAsignatura(Long idAsignatura){
        
        // Obtenemos un Iterador y recorremos la lista.
        Iterator<DetalleLibreta> iter = listDetalleLibretas.iterator();
        
        while (iter.hasNext()){
            DetalleLibreta dt=(DetalleLibreta)iter.next();
            // System.out.println(dt.getAsignatura());
            if(this.optNewOrUpdate==0){
               if(dt.getAsignatura().getIdAsignatura()==idAsignatura)
                return true;
            }
            else
            {
                DetalleLibreta dt1=listDetalleLibretas.get(currentLibIndex);
                if(dt.getAsignatura().getIdAsignatura()==idAsignatura && dt1.getAsignatura().getIdAsignatura()!=idAsignatura)
                 return true;
                
            }
               
        }
        return false;
    }

    /**
     * @return the msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * @param msg the msg to set
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * @return the page
     */
    public int getPage() {
        return page;
    }

    /**
     * @param page the page to set
     */
    public void setPage(int page) {
        this.page = page;
    }
    
    public Libreta findLibretaId(){
          // nota.setFechaRegistro(new Date());
        System.out.println("Buscando libreta Id ...");
        Libreta libreta=null;
        FacesContext facesContext = FacesContext.getCurrentInstance();
            ExternalContext externalContext = facesContext.getExternalContext();

            Map params = externalContext.getRequestParameterMap();
             idGrado = Integer.parseInt((String) params.get("idCursoGrado:idSelectGrado"));
            idAnio =Integer.parseInt( (String) params.get("idCursoGrado:idSelectAnio"));
            
        //Consultamos  NotaDB para obtener id nota:
        LibretaDB libretaDB=new LibretaDB();
       libreta= libretaDB.findLibreta( getIdGrado(),getIdAnio());
       return libreta;
      }
    
    
    public List<DetalleLibreta> findRecoveryLibretaId(){
        setOption(1);
        Libreta libreta=findLibretaId();
        setComentarios(libreta.getComentarios());
        this.listDetalleLibretas=new ArrayList(findLibretaId().getDetalleLibretas());
        return listDetalleLibretas;
      }

    /**
     * @return the option
     */
    public Integer getOption() {
        return option;
    }

    /**
     * @param option the option to set
     */
    public void setOption(Integer option) {
        this.option = option;
    }

    /**
     * @return the comentarios
     */
    public String getComentarios() {
        return comentarios;
    }

    /**
     * @param comentarios the comentarios to set
     */
    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }
    
    
      
}
